package outros;

import java.sql.Statement;
import java.io.File;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
import transporte.TOPatrimonio;

public class GeradorRelatorio extends Thread {
    private Conexao conexao = new Conexao();
    private String sql;
    private String relatorio;
    private JProgressBar barra;
    private JInternalFrame janela;

    public GeradorRelatorio() {
    }
    public void setSQL(String sql) {
        this.sql = sql;
    }
    public void setRelatorio(String relatorio) {
        this.relatorio = relatorio;
    }
    public void geraTermoTransferencia(String[] param, TOPatrimonio[] pat) {
        if (param[2]==null) {
            param[2] = "Responsável não associado";
        }
        if (param[4]==null) {
            param[4] = "Responsável não associado";
        }
        Map parametros = new HashMap();
        parametros.put("hoje", param[0]);
        parametros.put("da", param[1]+" - "+param[2]);
        parametros.put("para", param[3]+" - "+param[4]);
        parametros.put("deResponsavel", param[2]);
        parametros.put("paraResponsavel", param[4]);
        int cont = 0;
        for (int i=0;i<pat.length;i+=1) {
            if (pat[i].getNumero()!=-1) {
                parametros.put("item"+cont, pat[i].getNome());
                parametros.put("numero"+cont, "Nº "+
                                              pat[i].getArea()+"-"+
                                              pat[i].getGrupo()+"-"+
                                              pat[i].getSubgrupo()+"-"+
                                              pat[i].getNumero());
            cont += 1;
            }            
        }
        gera(parametros, "transferencia");
    }

    public void geraTermoGarantia(String[] param, TOPatrimonio[] pat, String[] locais, String[] obs) {
        Map parametros = new HashMap();
        parametros.put("fornecedor", param[0]);
        parametros.put("endereco", param[1]);
        parametros.put("setor", param[2]);
        parametros.put("fone", param[3]);
        parametros.put("data", param[4]);
        parametros.put("tipo", param[5]);
        int cont = 1;
        for (int i=0;i<pat.length;i+=1) {
            if (pat[i].getNumero()!=-1) {
                parametros.put("num"+cont, pat[i].getArea()+"-"+
                                           pat[i].getGrupo()+"-"+
                                           pat[i].getSubgrupo()+"-"+
                                           pat[i].getNumero());
                parametros.put("desc"+cont, pat[i].getNome());
                try {
                    parametros.put("local"+cont, locais[i]);
                } catch (Exception e) {
                    parametros.put("local"+cont, null);
                }
                try {
                    parametros.put("obs"+cont, obs[i]);
                } catch (Exception e) {
                    parametros.put("obs"+cont, null);
                }
            cont += 1;
            }
        }
        gera(parametros, "garantia");
    }
    public void geraTermoEmpInterno(String[] param, TOPatrimonio[] pat) {
        if (param[5]==null) {
            param[5] = "Responsável não associado";
        }
        Map parametros = new HashMap();
        parametros.put("hoje", param[0]);
        parametros.put("tipo", param[1]);
        parametros.put("setor", param[2]);
        parametros.put("ramal", param[3]);
        parametros.put("responsavel", param[4]);
        parametros.put("obs", "Obs.: "+param[5]);
        int cont = 0;
        for (int i=0;i<pat.length;i+=1) {
            if (pat[i].getNumero()!=-1) {
                parametros.put("numero"+cont, pat[i].getArea()+"-"+
                                           pat[i].getGrupo()+"-"+
                                           pat[i].getSubgrupo()+"-"+
                                           pat[i].getNumero());
                parametros.put("item"+cont, pat[i].getNome());
            cont += 1;
            }
        }
        gera(parametros, "emprestimo_interno");
    }

    public void geraTermoEmpExterno(String[] param, TOPatrimonio[] pat) {
        Map parametros = new HashMap();
        final String termo = "          Declaro ter recebido o material constante "+
              "desde documento a título de empréstimo e em perfeitas condições de "+
              "uso, responsabilizando-me sob as penas da lei, pela sua conservação "+
              "e guarda, comprometendo-me a devolver o equipamento na data de "+param[2]+
              " e a ressarcir quaisquer danos materiais que porventura possam advir "+
              "do referido empréstimo.";
        parametros.put("hoje", param[0]);
        parametros.put("tipo", param[1]);
        parametros.put("empresa", param[3]);
        parametros.put("cnpj", param[4]);
        parametros.put("endereco", param[5]);
        parametros.put("telefone", param[6]);
        parametros.put("responsavel", param[7]);
        parametros.put("termo", termo);
        int cont = 0;
        for (int i=0;i<pat.length;i+=1) {
            if (pat[i].getNumero()!=-1) {
                parametros.put("numero"+cont, pat[i].getArea()+"-"+
                                           pat[i].getGrupo()+"-"+
                                           pat[i].getSubgrupo()+"-"+
                                           pat[i].getNumero());
                parametros.put("item"+cont, pat[i].getNome());
            cont += 1;
            }
        }
        gera(parametros, "emprestimo_externo");
    }

    public void gerarRelatorio(String sql, String relatorio) {
        conexao.abrirConexao();
        Connection con = conexao.getConexao();
        JasperPrint rel = null;
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            JRResultSetDataSource tst = new JRResultSetDataSource(rs);
            HashMap map = new HashMap();
            map.put("QUERY",con);
            rel = JasperFillManager.fillReport(relatorio+".jasper", map, tst);
            JasperViewer.viewReport(rel, false);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }

    public void gerarRelatorio(String sql, String relatorio, HashMap<String, String> parametros) {
        conexao.abrirConexao();
        Connection con = conexao.getConexao();
        JasperPrint rel = null;
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            JRResultSetDataSource tst = new JRResultSetDataSource(rs);
            HashMap map = parametros;
            map.put("QUERY",con);
            rel = JasperFillManager.fillReport(relatorio+".jasper", map, tst);
            JasperViewer.viewReport(rel, false);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }

    public void setBarra(JProgressBar b) {
        barra = b;
        barra.setIndeterminate(true);
    }
    
    @Override
    public void run() {
        conexao.abrirConexao();
        Connection con = conexao.getConexao();
        JasperPrint rel = null;
        try {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            JRResultSetDataSource tst = new JRResultSetDataSource(rs);
            HashMap map = new HashMap();
            map.put("QUERY",con);
            rel = JasperFillManager.fillReport(relatorio+".jasper", map, tst);
            JasperViewer.viewReport(rel, false);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        barra.setStringPainted(false);
        barra.setIndeterminate(false);
    }

    private void gera(Map param, String nome) {
        conexao.abrirConexao();
        Connection con = conexao.getConexao();
        JasperReport relatorio;
        JasperPrint impressao;
        try {
            File fl = new File(nome+".jasper");
            relatorio = (JasperReport)JRLoader.loadObject(fl);
            impressao = JasperFillManager.fillReport(relatorio, param, con);
            JasperViewer.viewReport(impressao,false);
            /*JRPdfExporter pdfExporter = new JRPdfExporter();
            pdfExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, nome+".pdf");
            pdfExporter.setParameter(JRPdfExporterParameter.JASPER_PRINT , impressao);
            pdfExporter.exportReport();*/
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }
}
